//	Copyright (c) 2008, x-port.net ltd.
//
//	All rights reserved.
//
//	Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
//
//	    * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
//	    * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
//	    * Neither the name of the x-port.net ltd. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
//
//	THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
//	"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
//	LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
//	A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
//	CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
//	EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
//	PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
//	PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
//	LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
//	NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
//	SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//

#pragma once
#include "binaryBehavior.h"
#include <XBLEngine/XBLEngine.h>

class CXFormsXFormsElement;

//<summary>
//	Implementation of CBinaryBehavior which loads an appropriate XBL 
//	file from the UIImplRepository.
//</summary>
//<remarks>
//	This class differs from CElementWithXBL by attempting to have nothing to do with XForms.
//	m_pForm could be removed with a little work.
//</remarks>
#include <DOM/DOM2Core/DOM2Core.h>
class CAnyElementWithXBL
	:public CBinaryBehavior
	,public IObjectWithForm
{
public:

	DECLARE_GET_CONTROLLING_UNKNOWN();

	BEGIN_COM_MAP(CAnyElementWithXBL)
		COM_INTERFACE_ENTRY(IObjectWithForm)
		COM_INTERFACE_ENTRY_AUTOAGGREGATE(IID_INode,m_pDOM2NodeImpl.p,CLSID_Node)
		COM_INTERFACE_ENTRY_AUTOAGGREGATE(IID_IEventTarget,m_pDOM2EventTargetImpl.p,CLSID_EventTarget)
		COM_INTERFACE_ENTRY_CHAIN(CBinaryBehavior)
	END_COM_MAP()

	CAnyElementWithXBL(void);
	virtual ~CAnyElementWithXBL(void);
	
	STDMETHOD(get_formKey)(LONG* pVal);
	STDMETHOD(put_formKey)(LONG newVal);
	STDMETHOD(Detach)();
	virtual HRESULT getXML(IXMLDOMNode ** ppXML);
protected:
	virtual HRESULT DocumentReady();
	virtual HRESULT GetLocallySpecifiedBindingId(CComBSTR & bsId);
private:
	CComPtr<IEngine> m_pEngine;
	HRESULT getUI(IEngine ** ppEngine);

	//<summary>
	//	If specified, fetches a locally specified binding from an XML Data Island.
	//</summary>
	//<returns>
	//	S_OK if successful<br />
	//	S_FALSE if no xbl-binding was specified<br />
	//	otehrwise, an error value.
	//</returns>
	HRESULT GetLocallySpecifiedBinding(IEngine ** ppEngine);
	CXFormsXFormsElement * m_pForm;

	CComPtr<INode> m_pDOM2NodeImpl;
	CComPtr<IEventTarget> m_pDOM2EventTargetImpl;
};
